package GUI;

import movTeclado.*;
import Logica.*;

import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.UnsupportedAudioFileException;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.Timer;
import javax.swing.border.EmptyBorder;
import javax.swing.JLabel;

import java.awt.Font;
import java.util.AbstractMap;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.Map;
import java.util.TimerTask;

import javax.swing.SwingConstants;

import java.awt.Color;


import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.*;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;


/**
 * Clase frameJuego
 * @author Jonathan Fritz - Santiago Salem - Kevin Schweitzer.
 */
public class frameJuego extends javax.swing.JFrame implements Runnable,KeyListener {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private JPanel contentPane;
	private JPanel panelComienzo;
	private JPanel panelEleccion; 
	private JPanel panelNaves;
	private JPanel panelFinJuego;
	private static Juego juego;
	private JLabel puntaje;
	private JLabel fondo1;
	private JLabel fondo2;
	private moverFondo moveBack;
	private JLabel UP;
	private JLabel vida1;
	private JLabel vida2;
	private JLabel bomba1;
	private JLabel bomba2;
	private JLabel puntajeFinal;
	private JLabel nave2;
	private JLabel nave1;
	private JLabel mensajeFin;
	private JTextArea score;
	private String nombreJug = "NO NAME";
	private JLabel highScore;
	private boolean isMute = false;
	private JLabel puntajeHS;
	private JButton botonMute;
	private Clip sonido;
	private ArrayList<Thread> listaHilos = new ArrayList<Thread>();
	private ArrayList<Thread> listaMentes = new ArrayList<Thread>();
	private JLabel lblDao;
	private JLabel lblNormal;
	private JLabel lblFuerte;
	private JLabel lblRpido;
	private JLabel lblNormal_1;
	private JTextField campoNombre;
	private boolean presentado = false;
	private JLabel enterParpadea;
	private Timer timer;
	private boolean enNegro = true;



	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		try {            			
			frameJuego frame = new frameJuego();
			frame.setVisible(true);

			Thread hilo1 = new Thread(frame);
			hilo1.start();
			juego.setFrameJuego(frame);			

			frame.iniciarJuego();
		} catch (Exception e) {
			e.printStackTrace();
		}

	}



	/**
	 * Constructor de la clase frameJuego.
	 */
	public frameJuego() {
		juego=new Juego();
		initGUI();
		moveBack = new moverFondo(fondo1,fondo2,1,this);					
		moveBack.inicio();

	}



	/**
	 * Inicia el juego
	 */
	private void iniciarJuego(){		
		comienzo();
	}

	/**
	 * Realiza la construccion de la GUI
	 */
	private void initGUI() {

		addKeyListener(this); //Agrego para poder detectar el ENTER

		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 486, 704);
		setResizable(false);

		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(0, 0, 0, 0));
		setContentPane(contentPane);
		contentPane.setLayout(null);

		botonMute = new JButton("");
		botonMute.setIcon(new ImageIcon(getClass().getClassLoader().getResource("Imag/audio-on.png")));
		botonMute.setFocusable(false);
		botonMute.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				botonMuteActionPerformed();
			}
		});
		botonMute.setBounds(430, 631, 45, 33);
		contentPane.add(botonMute);		



		//PANEL COMIENZO Y SUS COMP

		panelComienzo = new JPanel();
		panelComienzo.setOpaque(false);
		panelComienzo.setVisible(true);
		panelComienzo .setBounds(0, 0, 485, 675);
		panelComienzo .setLayout(null);

		contentPane.add(panelComienzo);

		JLabel logoGalaga = new JLabel("");
		logoGalaga.setBounds(10, 128, 593, 298);
		logoGalaga.setIcon(new ImageIcon(getClass().getClassLoader().getResource("Imag/logoGalaga.gif")));
		panelComienzo.add(logoGalaga);		
		
		enterParpadea = new JLabel("PRESS ENTER");
		enterParpadea.setForeground(Color.WHITE);
		enterParpadea.setFont(new Font("Emulogic", Font.PLAIN, 13));
		enterParpadea.setBounds(162, 411, 158, 14);
		panelComienzo.add(enterParpadea);



		//PANEL ELECCION Y SUS COMP		


		panelEleccion = new JPanel();
		panelEleccion.setOpaque(false);
		panelEleccion.setVisible(false);
		panelEleccion .setBounds(0, 0, 485, 675);
		panelEleccion .setLayout(null);
		contentPane.add(panelEleccion );

		compPanelEleccion();


		//PANEL NAVES Y SUS COMP


		panelNaves = new JPanel();
		panelNaves.setVisible(false);
		panelNaves.setOpaque(false);
		panelNaves.setBounds(0, 0, 485, 675);
		panelNaves.setLayout(null);
		contentPane.add(panelNaves);

		compPanelNaves();


		panelFinJuego = new JPanel();
		panelFinJuego.setOpaque(false);
		panelFinJuego.setBounds(0, 0, 485, 675);
		panelFinJuego.setLayout(null);
		panelFinJuego.setVisible(false);
		contentPane.add(panelFinJuego);

		compPanelFin();		

		fondo1 = new JLabel();
		fondo1.setSize(this.getSize());
		fondo1.setIcon(new ImageIcon(getClass().getClassLoader().getResource("Imag/fondo_estrellas.png")));
		contentPane.add(fondo1);


		fondo2 = new JLabel();
		fondo2.setSize(this.getSize());
		fondo2.setLocation(0, -1 * this.getHeight());
		fondo2.setIcon(new ImageIcon(getClass().getClassLoader().getResource("Imag/fondo_estrellas.png")));
		contentPane.add(fondo2);
		
		timer = new Timer(400, new ActionListener() {
 
            @Override
            public void actionPerformed(ActionEvent e) {
            	if(enNegro){
        			enterParpadea.setForeground(Color.WHITE);
        			enNegro = false;
        		}
        		else{
        			enterParpadea.setForeground(Color.BLACK);
        			enNegro = true;
        		}
            }
        });
		timer.start();
		
		
		
		
		
	}
	


	/**
	 * Realiza la construccion del panel panelFinJuego
	 */
	private void compPanelFin(){


		puntajeFinal = new JLabel();
		puntajeFinal.setBounds(129, 201, 235, 23);
		panelFinJuego.add(puntajeFinal);
		puntajeFinal.setHorizontalAlignment(SwingConstants.CENTER);
		puntajeFinal.setForeground(Color.WHITE);
		puntajeFinal.setFont(new Font("Emulogic", Font.BOLD, 13));

		score = new JTextArea();
		score.setOpaque(false);
		score.setBounds(86, 219, 330, 324);
		panelFinJuego.add(score);
		score.setEditable(false);
		score.setEnabled(false);
		score.setForeground(Color.RED);
		score.setFont(new Font("Emulogic", Font.PLAIN, 13));

		mensajeFin = new JLabel();
		mensajeFin.setBounds(132, 171, 215, 23);
		panelFinJuego.add(mensajeFin);
		mensajeFin.setHorizontalAlignment(SwingConstants.CENTER);
		mensajeFin.setForeground(Color.RED);
		mensajeFin.setFont(new Font("Emulogic", Font.PLAIN, 13));
	}

	/**
	 * Realiza la construccion del panel panelEleccion
	 */
	private void compPanelEleccion(){
		

		JLabel lblNewLabel = new JLabel("Selecciona tu nave");
		lblNewLabel.setForeground(Color.RED);
		lblNewLabel.setFont(new Font("Emulogic", Font.PLAIN, 13));
		lblNewLabel.setBounds(112, 77, 244, 33);
		panelEleccion.add(lblNewLabel);
		
		nave1 = new JLabel();
		nave1.setBounds(35, 220, 137, 161);
		panelEleccion.add(nave1);
		nave1.setIcon(new ImageIcon(getClass().getClassLoader().getResource("Imag/nave1.png")));

		nave2 = new JLabel();
		nave2.setBounds(301, 220, 137, 161);
		panelEleccion.add(nave2);
		nave2.setIcon(new ImageIcon(getClass().getClassLoader().getResource("Imag/nave2.png")));

		JLabel lblVelocidad = new JLabel("Velocidad");
		lblVelocidad.setHorizontalAlignment(SwingConstants.CENTER);
		lblVelocidad.setFont(new Font("Emulogic", Font.PLAIN, 12));
		lblVelocidad.setForeground(Color.YELLOW);
		lblVelocidad.setBounds(183, 429, 117, 14);
		panelEleccion.add(lblVelocidad);

		campoNombre = new JTextField();
		campoNombre.setBounds(194, 555, 86, 20);
		panelEleccion.add(campoNombre);

		lblDao = new JLabel("Ataque");
		lblDao.setHorizontalAlignment(SwingConstants.CENTER);
		lblDao.setFont(new Font("Emulogic", Font.PLAIN, 12));
		lblDao.setForeground(Color.YELLOW);
		lblDao.setBounds(200, 476, 77, 14);
		panelEleccion.add(lblDao);

		lblNormal = new JLabel("Normal");
		lblNormal.setHorizontalAlignment(SwingConstants.CENTER);
		lblNormal.setForeground(Color.WHITE);
		lblNormal.setFont(new Font("Emulogic", Font.PLAIN, 12));
		lblNormal.setBounds(70, 427, 80, 14);
		panelEleccion.add(lblNormal);

		lblFuerte = new JLabel("Fuerte");
		lblFuerte.setHorizontalAlignment(SwingConstants.CENTER);
		lblFuerte.setForeground(Color.WHITE);
		lblFuerte.setFont(new Font("Emulogic", Font.PLAIN, 12));
		lblFuerte.setBounds(70, 476, 78, 14);
		panelEleccion.add(lblFuerte);

		lblRpido = new JLabel("Rapido");
		lblRpido.setHorizontalAlignment(SwingConstants.CENTER);
		lblRpido.setForeground(Color.WHITE);
		lblRpido.setFont(new Font("Emulogic", Font.PLAIN, 12));
		lblRpido.setBounds(331, 430, 86, 14);
		panelEleccion.add(lblRpido);

		lblNormal_1 = new JLabel("Normal");
		lblNormal_1.setHorizontalAlignment(SwingConstants.CENTER);
		lblNormal_1.setForeground(Color.WHITE);
		lblNormal_1.setFont(new Font("Emulogic", Font.PLAIN, 12));
		lblNormal_1.setBounds(336, 476, 81, 14);
		panelEleccion.add(lblNormal_1);
		
		JLabel ingreseNombre = new JLabel("Ingrese Nombre");
		ingreseNombre.setForeground(Color.RED);
		ingreseNombre.setFont(new Font("Emulogic", Font.PLAIN, 13));
		ingreseNombre.setBounds(150, 500, 244, 33);
		panelEleccion.add(ingreseNombre);
		
	}

	/**
	 * Realiza la construccion del panel panelNaves
	 */
	private void compPanelNaves(){
		puntajeHS = new JLabel(mayorPuntaje());
		puntajeHS.setHorizontalAlignment(SwingConstants.CENTER);
		puntajeHS.setFont(new Font("Emulogic", Font.BOLD, 13));
		puntajeHS.setForeground(Color.WHITE);
		puntajeHS.setBounds(180, 21, 131, 14);
		panelNaves.add(puntajeHS);

		highScore = new JLabel("HIGH SCORE");
		highScore.setHorizontalAlignment(SwingConstants.CENTER);
		highScore.setFont(new Font("Emulogic", Font.PLAIN, 13));
		highScore.setForeground(Color.RED);
		highScore.setBounds(172, 1, 146, 17);
		panelNaves.add(highScore);

		vida1 = new JLabel();
		vida1.setIcon(new ImageIcon(getClass().getClassLoader().getResource("Imag/vida.png")));
		vida1.setBounds(12, 616, 88, 81);
		panelNaves.add(vida1);

		vida2 = new JLabel();
		vida2.setBounds(45, 628, 66, 56);
		vida2.setIcon(new ImageIcon(getClass().getClassLoader().getResource("Imag/vida.png")));
		panelNaves.add(vida2);

		bomba1 = new JLabel();
		bomba1.setIcon(new ImageIcon(getClass().getClassLoader().getResource("Imag/bomba.png")));
		bomba1.setBounds(330,628,bomba1.getIcon().getIconWidth(),bomba1.getIcon().getIconHeight());
		panelNaves.add(bomba1);
		bomba1.setVisible(true);
		
		bomba2 = new JLabel();
		bomba2.setIcon(new ImageIcon(getClass().getClassLoader().getResource("Imag/bomba.png")));
		bomba2.setBounds(330+bomba2.getIcon().getIconWidth(),628,bomba2.getIcon().getIconWidth(),bomba2.getIcon().getIconHeight());
		panelNaves.add(bomba2);
		bomba2.setVisible(true);
		
		UP = new JLabel("1UP");
		UP.setHorizontalAlignment(SwingConstants.LEFT);
		UP.setForeground(Color.RED);
		UP.setFont(new Font("Emulogic", Font.PLAIN, 13));
		UP.setBounds(12, 0, 46, 18);
		panelNaves.add(UP);


		puntaje = new JLabel("0");
		puntaje.setHorizontalAlignment(SwingConstants.LEFT);
		puntaje.setForeground(Color.WHITE);
		puntaje.setFont(new Font("Emulogic", Font.BOLD, 13));
		puntaje.setBounds(13, 13, 139, 28);
		panelNaves.add(puntaje);
	}

	/**
	 * Calcula el mayor puntaje del ranking
	 * @return String que representa el mayor puntaje
	 */
	private String mayorPuntaje() {
		String path = System.getProperty("user.dir");
		path +="/score.txt";
		String HS = "";
		try{
			BufferedReader in = new BufferedReader(new FileReader(new File (path)));
			String linea;
			boolean hacer = true;
			int puntajeLeido;
			while ((linea = in.readLine()) != null && hacer) {
				String palabra[] = linea.split("	");			
				puntajeLeido = Integer.parseInt(palabra[1]); //Se que esta en segundo lugar
				HS = Integer.toString(puntajeLeido);
				hacer = false; //Necesito solo hacerlo 1 vez ya que quiero el mayor puntaje que esta primero
			}
			in.close();		

		}
		catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return HS;	
	}



	/**
	 * Desactiva el sonido 
	 */
	private void audioOff(){
		botonMute.setIcon(new ImageIcon(getClass().getClassLoader().getResource("Imag/audio-off.png")));
		isMute = true;
		if(panelComienzo.isVisible())
			sonido.stop();		
	}

	/**
	 * Activa el sonido 
	 */
	private void audioOn(){
		botonMute.setIcon(new ImageIcon(getClass().getClassLoader().getResource("Imag/audio-on.png")));
		isMute = false;
		if(panelComienzo.isVisible())
			sonido.start();		
	}


	/**
	 * Accion que realiza el boton para activar o desactivar el sonido
	 */
	private void botonMuteActionPerformed(){
		if (isMute){
			audioOn();
		}
		else{
			audioOff();
		}
	}

	/**
	 * Retorna si el sonido esta activado o desactivado
	 * @return verdadero si esta desactivado y falso si esta activado
	 */
	public boolean isMute(){
		return isMute;
	}

	/**
	 * Da comienzo al panel de inicio junto con su sonido predefinido
	 */
	private void comienzo(){		
		try {
			sonidoComienzo();
		} catch (LineUnavailableException | IOException
				| UnsupportedAudioFileException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		long startTime = System.currentTimeMillis();
		long elapsedTime = 0L;

		while (elapsedTime < 7*1000) {
			elapsedTime = (new Date()).getTime() - startTime;

		}
		saltearPresentacion();

	}

	/**
	 * Reproduce el sonido de inicio del juego
	 * @throws LineUnavailableException, indica que la linea no puede ser abierda porque no esta disponible.
	 * @throws IOException, indica que se produjo un error con algun operacion de entrada/salida
	 * @throws UnsupportedAudioFileException, indica que se produjo un error ya que el archivo no contiene informacion valida de un formato conocido
	 * 
	 */
	private void sonidoComienzo() throws LineUnavailableException, IOException, UnsupportedAudioFileException{
		BufferedInputStream bis = new BufferedInputStream(getClass().getClassLoader().getResourceAsStream("Sonidos/theme.wav"));
		AudioInputStream ais = AudioSystem.getAudioInputStream(bis);
		sonido = AudioSystem.getClip();
		sonido.open(ais);
		sonido.start();			
	}

	/**
	 * Reproduce el sonido de victoria
	 * @throws LineUnavailableException, indica que la linea no puede ser abierda porque no esta disponible.
	 * @throws IOException, indica que se produjo un error con algun operacion de entrada/salida
	 * @throws UnsupportedAudioFileException, indica que se produjo un error ya que el archivo no contiene informacion valida de un formato conocido
	 * 
	 */
	private void sonidoWin() throws LineUnavailableException, IOException, UnsupportedAudioFileException{
		if(!isMute){
			BufferedInputStream bis = new BufferedInputStream(getClass().getClassLoader().getResourceAsStream("Sonidos/win.wav"));
			AudioInputStream ais = AudioSystem.getAudioInputStream(bis);
			sonido = AudioSystem.getClip();
			sonido.open(ais);
			sonido.start();	
		}
	}

	/**
	 * Reproduce el sonido de derrota
	 * @throws LineUnavailableException, indica que la linea no puede ser abierda porque no esta disponible.
	 * @throws IOException, indica que se produjo un error con algun operacion de entrada/salida
	 * @throws UnsupportedAudioFileException, indica que se produjo un error ya que el archivo no contiene informacion valida de un formato conocido
	 * 
	 */
	private void sonidoGameOver() throws LineUnavailableException, IOException, UnsupportedAudioFileException{
		if(!isMute){

			BufferedInputStream bis = new BufferedInputStream(getClass().getClassLoader().getResourceAsStream("Sonidos/gameover.wav"));
			AudioInputStream ais = AudioSystem.getAudioInputStream(bis);
			sonido = AudioSystem.getClip();
			sonido.open(ais);
			sonido.start();	
		}
	}


	/**
	 * Agrega oyentes y establece la correspondiente accion de cada uno para la creacion de la naveJugador
	 * 
	 */
	private void elegirNave(){
		nave1.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent e) {
				creacion(1);
			}
		});
		nave2.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent e) {
				creacion(2);
			}
		});
	}

	/**
	 * Crea la naveJugador que corresponda.
	 * @param nro, determina la nave que debe crearse.
	 */
	private void creacion(int nro){
		juego.crearJugador(nro);
		campoNombre.setFocusable(false);
		panelNaves.requestFocus();
	}


	/**
	 * Saltea la presentacion.
	 */
	private void saltearPresentacion(){

		if(!presentado){
			sonido.stop(); //Si se apreta varias veces el boton mute en el comienzo cuando pasen los 7 segundos se corta
			panelComienzo.setVisible(false);
			panelEleccion.setVisible(true);
			elegirNave();		
			presentado = true;
			removeKeyListener(this); //Elimino el oyente porque ya no lo necesito
			timer.stop(); //No necesito el parpadeo
		}

	}



	/**
	 * Se encarga de obtener los puntajes del ranking para que sean mostrados al finalizar el juego.
	 * 
	 */
	private void obtenerPuntajes(){
		try {
			String path = System.getProperty("user.dir");
			path +="/score.txt";
			ArrayList<Map.Entry<Integer, String>> listaElementos = new ArrayList<Map.Entry<Integer, String>>();
			Map.Entry<Integer, String> entradaAux;
			if(!campoNombre.getText().equals("")){
				nombreJug = campoNombre.getText();
			}

			int miPuntaje = Integer.parseInt(puntaje.getText());
			BufferedReader in = new BufferedReader(new FileReader(new File (path)));
			String linea;

			//inserto en la lista mi puntaje
			entradaAux = new AbstractMap.SimpleEntry<Integer,String>(new Integer(miPuntaje), nombreJug);
			listaElementos.add(entradaAux);

			while ((linea = in.readLine()) != null) {
				String palabra[] = linea.split("	");

				int puntajeLeido = Integer.parseInt(palabra[1]); //Se que esta en segundo lugar
				String nombre = palabra[2]; //se que esta en tercer lugar
				entradaAux = new AbstractMap.SimpleEntry<Integer,String>(new Integer(puntajeLeido), nombre);
				listaElementos.add(entradaAux);
			}
			in.close();			

			FileWriter fw= new FileWriter(path);
			BufferedWriter bw = new BufferedWriter(fw); ;
			int i = 0;

			while(listaElementos.size() > 1){
				entradaAux = encontrarMayor(listaElementos);
				listaElementos.remove(entradaAux); //Elimino la entrada que obtuve
				linea = "RANK"+(i+1)+"	"+entradaAux.getKey().toString()+"	"+entradaAux.getValue();
				score.setText(score.getText()+linea+"\n");	
				bw.write(linea);
				bw.newLine(); 
				i++;
			}
			bw.close();			



		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}



	}

	/**
	 * Retorna la entrada con mayor puntaje.
	 * @param listaElementos, lista de entradas que contienen el puntaje y nombre.
	 * @returm entrada con mayor puntaje.
	 */
	private Map.Entry encontrarMayor(ArrayList<Map.Entry<Integer, String>> listaElementos){
		Integer clave = -1;
		Integer aux;
		Map.Entry entrada = null;
		Map.Entry entradaAux;
		Iterator iterador = listaElementos.iterator();
		while(iterador.hasNext()){
			entradaAux = (Map.Entry) iterador.next();
			aux = (Integer) entradaAux.getKey();
			if (clave.compareTo(aux) == -1){
				entrada = entradaAux;
				clave = aux;
			}
		}
		return entrada;

	}

	/**
	 * Se encarga de finalizar los hilos correspondientes y mostrar el mensaje correcto
	 * @param fin, mensaje a mostrar
	 */
	public void notificarFin(String fin){

		try {
			//Paro todos los hilos en ejecucion
			if(!fin.equals("WIN")){
				for(int i=0; i<listaHilos.size(); i++){
					Thread actual = listaHilos.get(i);
					actual.stop();
				}
				listaHilos.clear();
			}


			for(int i=0; i<listaMentes.size(); i++){
				mente actual = (mente) listaMentes.get(i);
				actual.fin();
			}
			listaMentes.clear();

			if (fin.equals("GAME OVER"))			
				sonidoGameOver();
			else
				sonidoWin();


			mensajeFin.setText(fin);
			panelNaves.setVisible(false);
			puntajeFinal.setText(puntaje.getText());
			panelFinJuego.setVisible(true);	
			obtenerPuntajes();
		}	
		catch (LineUnavailableException | IOException
				| UnsupportedAudioFileException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	/**
	 * Se encarga de quitar del panel el corazon correspondiente.
	 */
	public void quitarVida(){
		if (vida2.isVisible()){
			vida2.setVisible(false);
		}
		else{
			vida1.setVisible(false);
		}
	}
	/*
	 * Quita del panel la etiqueta de una bomba cuando es usada
	 */
	public void useBomba(){
		if(bomba1.isVisible())
			bomba1.setVisible(false);
		else
			bomba2.setVisible(false);
	}
	
	/*
	 * Agrega al panel una etiqueta bomba cuando es agarrado el PU
	 */
	public void agarreBomba(){
		if(bomba2.isVisible()){
			bomba1.setVisible(true);
		}
		else{
			bomba2.setVisible(true);
		}
	}

	/**
	 * Retorna el panelEleccion.
	 * @return panelEleccion.
	 */
	public JPanel getPanelEleccion(){
		return panelEleccion;
	}

	/**
	 * Retorna el panelNaves.
	 * @return panelNaves.
	 */
	public JPanel getPanelNaves(){
		return panelNaves;
	}

	/**
	 * Retorna el panelFinJuego.
	 * @return panelFinJuego.
	 */
	public JPanel getPanelFinJuego(){
		return panelFinJuego;
	}

	/**
	 * Retorna el JLabel del puntaje.
	 * @return JLabel del puntaje.
	 */
	public JLabel getPuntaje(){
		return puntaje;
	}


	/**
	 * Retorna la listaHilos.
	 * @return listaHilos.
	 */
	public ArrayList<Thread> getListaHilos(){
		return listaHilos;
	}

	/**
	 * Retorna la listaMentes.
	 * @return listaMentes.
	 */
	public ArrayList<Thread> getListaMentes(){
		return listaMentes;
	}


	/**
	 * Da comienzo a la ejecucion de la parte logica del juego
	 */
	public void run() {
		juego.gameLoop();		
	}



	/**
	 * Dependiendo la tecla que fue presionada, se ejecuta la respuesta correspondiente.
	 * @param arg0, evento capturado.
	 */
	public void keyPressed(KeyEvent arg0) {

		switch(arg0.getKeyCode()){

		case KeyEvent.VK_ENTER: {                                	

			saltearPresentacion();

			break;
		}

		}

	}



	/**
	 * Dependiendo la tecla que fue soltada, se ejecuta la respuesta correspondiente.
	 * @param arg0, evento capturado.
	 */
	public void keyReleased(KeyEvent arg0) {
		// TODO Auto-generated method stub

	}



	/**
	 * Dependiendo la tecla que fue tipeada, se ejecuta la respuesta correspondiente.
	 * @param arg0, evento capturado.
	 */
	public void keyTyped(KeyEvent arg0) {
		// TODO Auto-generated method stub

	}
}
